package Sistema;

import java.util.ArrayList;


import Excepcion.EstacionInalcanzableException;
import Excepcion.EstacionInexistenteException;
import Excepcion.TrayectoInexistenteException;

public class EstacionInicial extends Estacion {
	
	private ArrayList<TrayectoComun> trayectosComunesSalientes;
	private ArrayList<TrayectoDeMantenimiento> trayectosDeMantenimientoSalientes;
	
	
	/**Contructor, recibe el nombre y el objeto red vial al que pertenece
	 * @param nombre
	 * @param red
	 */
	public EstacionInicial(String nombre, RedVial red) {
		
		super(nombre, red);
		trayectosComunesSalientes = new ArrayList<TrayectoComun>();
		trayectosDeMantenimientoSalientes = new ArrayList<TrayectoDeMantenimiento>();
	
		
	}
	
	/**Agrega un objeto trayecto a la lista de trayectosComunesSalientes
	 * @param trayectoComun
	 */
	public void addTrayectoComunSaliente(TrayectoComun trayectoComun) {
		trayectosComunesSalientes.add(trayectoComun);
	}
	
	/**Agrega un objeto trayectoComunSaliente a la lista
	 * @param trayectoDeMantenimiento
	 */
	public void addTrayectoDeMantenimientoSaliente(TrayectoDeMantenimiento trayectoDeMantenimiento) {
		trayectosDeMantenimientoSalientes.add(trayectoDeMantenimiento);
	}
	
	/**Retorna la lista de todos los trayectos comunes contenidos por esta estacion
	 * @return
	 */
	public ArrayList<TrayectoComun> getTrayectosComunesSalientes() {
		return trayectosComunesSalientes;
	}
	
	/**Retorna una lista de todos los trayectos de mantenimiento contenidos por esta estacion
	 * @return
	 */
	public ArrayList<TrayectoDeMantenimiento> getTrayectosDeMantenimientoSalientes() {
		return trayectosDeMantenimientoSalientes;
	}
	
	/**Elimina un trayecto de la lista trayectosComunesSalientes
	 * @param origenTrayecto
	 * @param destinoTrayecto
	 * @throws TrayectoInexistenteException
	 */
	public void eliminarTrayectoComunSaliente(Estacion origenTrayecto, Estacion destinoTrayecto) throws TrayectoInexistenteException {
		TrayectoComun aux = new TrayectoComun(1);
		aux.setOrigen(origenTrayecto);
		aux.setDestino(destinoTrayecto);
		if (redVial.getTrayectos().contains(aux)) {
			throw new TrayectoInexistenteException();
		}
		else {
		for(int i=0; i<trayectosComunesSalientes.size();i++){
		if(trayectosComunesSalientes.get(i).getOrigen().equals(origenTrayecto) && trayectosComunesSalientes.get(i).getDestino().equals(destinoTrayecto)){
			trayectosComunesSalientes.remove(i);
		}
		}	
		}
	}
	
	/**Elimina un trayecto de mantenimiento de la lista trayectosDeMantenimientoSaliente
	 * @param origenTrayecto
	 * @param destinoTrayecto
	 * @throws TrayectoInexistenteException
	 */
	public void eliminarTrayectoDeMantenimientoSaliente(Estacion origenTrayecto, Estacion destinoTrayecto) throws TrayectoInexistenteException {
		TrayectoDeMantenimiento aux = new TrayectoDeMantenimiento(1);
		aux.setOrigen(origenTrayecto);
		aux.setDestino(destinoTrayecto);
		if (redVial.getTrayectos().contains(aux)) {
			throw new TrayectoInexistenteException();
		}
		else {
		for(int i=0; i<trayectosDeMantenimientoSalientes.size();i++){
			if(trayectosDeMantenimientoSalientes.get(i).getOrigen().equals(origenTrayecto) && trayectosDeMantenimientoSalientes.get(i).getDestino().equals(destinoTrayecto)){
				trayectosDeMantenimientoSalientes.remove(i);
			}
			}	
		}
	}
		
	public boolean equals(Object objeto) {
		if (objeto != null
				&& objeto.getClass() == EstacionInicial.class
				&& ((EstacionInicial)objeto).equals(nombre)) {
			return true;
		}
		return false;
	}
	
}